//! 事务处理

use async_trait::async_trait;
use nacos_core::{Result, Storage};
use crate::memory::MemoryStorage;
use tracing::warn;

/// 事务操作trait
#[async_trait]
pub trait Transaction: Send + Sync {
    async fn commit(self) -> Result<()>;
    async fn rollback(self) -> Result<()>;
}

/// 支持事务的存储trait
#[async_trait]
pub trait TransactionalStorage: Send + Sync {
    type Tx: Transaction;
    async fn begin_transaction(&self) -> Result<Self::Tx>;
}

// --- 内存事务实现 ---

/// 内存事务
/// 这只是一个逻辑上的事务，因为它操作的是同一个内存存储实例。
/// 真正的原子性由 MemoryStorage 内部的 RwLock 保证。
pub struct MemoryTransaction {
    storage: MemoryStorage,
    // 在一个更复杂的实现中，这里可以暂存操作日志
}

impl MemoryTransaction {
    pub(crate) fn new(storage: MemoryStorage) -> Self {
        Self { storage }
    }

    // 为事务提供直接的写操作方法
    pub async fn put(&mut self, key: &str, value: &[u8]) -> Result<()> {
        self.storage.put(key, value).await
    }
}

#[async_trait]
impl Transaction for MemoryTransaction {
    async fn commit(self) -> Result<()> {
        // 锁在每个操作中获取和释放，所以这里无需做任何事
        Ok(())
    }

    async fn rollback(self) -> Result<()> {
        // 简化的实现：因为更改是立即写入的，所以无法回滚。
        warn!("MemoryTransaction rollback is a no-op in this simplified implementation.");
        Ok(())
    }
}
